%include	'Macros.inc'
cr	equ	0Dh		;������� �������
lf	equ	0Ah		;������� ������
;
;	������� ���� ���������
;	-----------------------------------------
;
	absolute	80h		;��������� ���� ����� �����-�������� 80h
Lparam	resb	1			;����� ������ �������
Param	resb	1			;������ ���� ������
	segment data			;����������� ������� ������
Lname0	db	81 			;������������ ����� ����� �����
Lname	db	0			;����������� ����� ����� �����
NameFile times	81	db	0	;��� �����
Lognum	dw	0			;���������� ����� �����
Segin	dw	0
Old	dd	0
ProgAdr dd	0
BlocPar	times	14	db	0
	segment stack			;����������� ������� �����
	times	64	db	0
	segment	code			;����������� ������� ����
..start:
; "��������" ������������ �������� ������ � ��������. ������� ������
	mov	ax,data			;"��������" ������������ �������� ������
	mov	es,ax			; � �������������� ������� ������ 
	mov	ax,ds			;����������� � Segin ������
	mov	[es:Segin],ax		; ���������
;��������� ����������� ������� �����������
	mov	ax,data
	mov	ds,ax
	mov	ax,3501h		;���������� �������� �����������
	int	21h			; ������� 1 � ��������� ES � BX
	mov	[Old],bx		;� �����
	mov	[Old+2],es		; � ���� Old
	mov	ax,data
	mov	es,ax
	mov	ax,code
	mov	ds,ax
	mov	ax,2501h		;������ ���������� ������ �����������
	mov	dx,Begin		; � ������ ����������
	int	21h			; � ������� 1
; ������������ ������ ������
	mov	ds,[es:Segin]
	mov	ax,ds
 	mov	bx,data1
	sub	bx,ax
	mov	es,ax
	mov	ah,4ah
	int	21h
	jnc	.M1
	Out_str	MemAllocErr
	jmp	.Exit
; ����������� ������� ����� �����
.M1:	xor	cx,cx			;��������� CX
	mov	cl,[Lparam]		;CL <- ����� ������
	cmp	cx,0			;����� �����������?
	jnz	.M2                     ; ���
	Out_str	MsgFileNotSpec		;��������� �� ���������� ����� �����
	jmp	.Exit
; ��������� ����� � ����� �����
.M2:    mov	ax,data
	mov	es,ax
	dec	cx			;������� ������ � ����� �����(��������)
        mov	[es:Lname],cx           ;�������� � Lname ����� ����� �����
	xor	si,si
	mov	bx,1
.Next:	mov	ax,[Param+bx]           ;���������� ��� �����
	mov	[es:NameFile+si],ax	; � Namefile
	inc	si
	inc	bx
	loop	.Next
	mov	[es:NameFile+si],byte 0	;������ �������� �����
; �������� �����
	mov	ax,data                 ;"��������" ������������ �������� ������
	mov	ds,ax                   ; � �������� ������� ������ 
	mov	dx,NameFile		;DX <- �������� ����� �����
	mov	bx,BlocPar		;BX <- �������� ����� ����������
	mov	ax,4b01h		;�������� � ���������� ��������
	int	21h			;�������� �������� ���������
	jnc	.M3			;���� �������
	Out_str	ErrorOpenFile		;��������� �� ������ �������� �����
	jmp	.Exit			;�����
;�����������
.M3:	mov	ax,6200h		;��������� ��������
	int	21h			; ����������� ���������
	mov	[es:ProgAdr],word 100h	;���������� �������� (������ ��� com ������)
	mov	[es:ProgAdr+2],bx	; � ��������
	pushf				;���������� ������
	push	cs			; ��������
	push	.Exit			; �������� ��� ������ �� ������������ ���������
	pushf				;���������
	pop	ax			; �����
	or	ax,100h			; �����������
	push	ax
	popf
	jmp	far	[es:ProgAdr]	;������ ������������ ���������
;�����
.Exit:	mov	ax,2501h		;�������� ������� ���������� � ������ 1
	mov	dx,[Old]
	mov	ds,[Old+2]
	int	21h
	mov	ax,4c00h                ;������� � DOS
	int	21h			
MemAllocErr	db	'Memory allocation error', cr, lf, '$'
MsgFileNotSpec	db	'File name not specified', cr, lf, '$'
ErrorOpenFile	db	'Error open file', cr, lf, '$'

Begin:	
;���������� ���������
	sti				;���������� ����������� ����������
	push	ax			;����������� � ����� ���������
	push	dx
	push	ds
	push	es
	pushf
	push	bx
	push	ax
	mov	ax,cs			;"��������" �������� ����
	mov	ds,ax                   ; � ��� ��������
	mov	es,ax			; ������

.M1:	mov	ah,8		;���� �������
	int	21h		; � ����������
	mov	dl,al           ;����������� ���� ������� � ������� DL ��� ����������� ������ �� �����
	or	al,20h
	cmp	al,'t'
 	jnz	.M1

	Out_str	MsgAX
	pop	dx
	call	Write_word_hex 
	call	Send_crlf
	Out_str	MsgBX
	pop	dx
	call	Write_word_hex 
	call	Send_crlf
;������ ���������� �����������	
;	pushf
;	push	cs
;	push	.M				
;	jmp	far	[Old]
;�����
.Exit:	popf
	pop	es
	pop	ds
	pop	dx
	pop	ax
	iret
MsgAX	db	'AX=$'
MsgBX	db	'BX=$'

;
;	����� ������������������ ����� �� ������ ����� ������ ������ �����
;	-------------------------------------------------------------------------
; �����: DX �������� ��������� �����
; ������: Write_byte_hex
;
Write_word_hex:
	push bx
	push cx
	push dx
	mov bx,dx
	mov cl,8h
	shr dx,cl		;����� ������ �� 8 ��������
	call Write_byte_hex	;����� �������� �����
	mov dx,bx
	call Write_byte_hex	;����� �������� �����
	pop dx
	pop cx 
	pop bx
	ret
;
;	����� ����������� ������������������ �����
;	----------------------------------------------
; �����: DL �������� ��������� �����
; ������: Write_digit_hex
;
Write_byte_hex:
	push	bx
	push	cx
	mov	bl,dl
	mov	cl,4h
	shr	bl,cl			;����� ������ �� 4 �������
	call	Write_digit_hex		;����� ������� �����
	mov	bl,dl
	and	bl,0fh			;��������� �������� ���������
	call	Write_digit_hex		;����� ������� �����
	pop	cx 
	pop	bx
	ret
;
;	����� ����������������� �����
;	-------------------------------
; �����: BL �������� ����������������� �����
; ������: Write_char
Write_digit_hex:
	push	dx
	mov	dl,bl
	cmp	dl,09h			;���� DL>9, �� ��������� �� .ja 
	ja	.ja                  
	add	dl,30h              	;�� 0 �� 9 + 30h
	jmp	.jmp
.ja:	add	dl,37h              	;�� A �� F + 37h
.jmp:	call	Write_char 
	pop	dx
	ret
;
;	����� ������� �� �����
;	----------------------
; �����: DL �������� ��� �������, ���������� �� �����
;
Write_char:
	push	ax
	cmp	dl,20h			;���� ��� ������� ������ 20h
	jae	.jae			; �� �������
	mov	dl,2Eh			; �����
.jae:	mov	ax,0200h		;������� ������ �������
	int	21h			;����� ������� �� �����
	pop	ax
	ret
;
;	������� ������ ������
;	---------------------
;
Send_crlf:
	push	ax
	push	dx
	mov	ah,2 		;������� ������
	mov	dl,cr		;��������� ������
	int	21h		;����� �������
	mov	dl,lf
	int	21h		; -"-
	pop	dx
	pop	ax
	ret
; ��������� ����������� �������
	segment	data1	data